package com.itqf.service.impl;

import com.itqf.entity.SysMenu;
import com.itqf.mapper.SysMenuMapper;
import com.itqf.service.SysMenuService;
import com.itqf.utils.R;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @Description:
 * @Company: 千锋互联
 * @Author: 李丽婷
 * @Date: 2020/10/20
 * @Time: 上午9:39
 */
@Service
public class SysMenuServiceImpl  implements SysMenuService {

    @Resource
    private SysMenuMapper sysMenuMapper;

    /**
     * 组装json   用户能访问的菜单信息和权限信息
     * {menuList:[{menuId:1,...,list:[{}]}],code:0,permissions:["sys:menu:delete","",""]}
     *      班级管理   menu_id  = 1
     *  	 	查看班级   parent_id = 1
     *  	 	测评管理    parent_id = 1
     * @param uid
     * @return
     */
    @Override
    public R findUserMenuAndPerms(Long uid) {
        //1.目录
        List<SysMenu> dirs = sysMenuMapper.findDirByUid(uid);
        //2.查询目录下的子菜单
        for (SysMenu dir : dirs) {
            List<SysMenu> childMenus = sysMenuMapper.
                    findMenuByUidAndParentId(uid,dir.getMenuId());
            //3.把查询出的菜单列表 设置给 当前目录
            dir.setList(childMenus);
        }

        //4.查询用户的具有的所有权限
        List<String> list = sysMenuMapper.findPermsByUid(uid);
        //null    "sys:menu:delete,sys:menu:save"
        Set<String> perms = new HashSet<>();
        for (String s : list) {
            if (s!=null){
                String p[] = s.split(",");
                for (String perm : p) {
                    perms.add(perm);
                }
            }
        }


        R r = R.ok();//,code:0
        r.put("menuList",dirs);//先搞定菜单和目录

        r.put("permissions",perms);
        return r;
    }

    /**
     * 前端用了分页
     * 服务端的响应的json格式:
     * {
     *     "total": 200,  //总的记录数
     *     "rows": [  每页显示的列表
     *         {
     *             "id": 0,
     *             "name": "Item 0",
     *             "price": "$0"
     *         }]
     *         }
     * @return
     */
    @Override
    public R findMenuByPage(int limit,int offset,String order,String search) {
        //sysMenuMapper.selectPage(IPage,Wrapper);

        List<SysMenu> list = sysMenuMapper.findMenuByPage(limit,offset,order,search);
        long total = sysMenuMapper.findMenuTotal(search);

        return new R().put("total",total).put("rows",list);
    }

    @Override
    public R findMenuTree() {
        //数据库
        List<SysMenu> list = sysMenuMapper.findMenuTree();
        //方案1)自定义一个顶级目录  （一级目录）
        //方案2)数据库新增一天 系统管理的父菜单即可。
        SysMenu sysMenu = new SysMenu();
        sysMenu.setName("顶级目录");
        sysMenu.setType(0);
        sysMenu.setMenuId(0l);//系统管理的父目录
        sysMenu.setParentId(-1l);

        list.add(sysMenu);
    //r.menuList
        return R.ok().put("menuList",list);
    }

    @Override
    public R save(SysMenu sysMenu) {
            int i = sysMenuMapper.add(sysMenu);
            //如果角色管理员，把新增的菜单或者目录  展示  到 左侧
            //sys_role_menu  1
        return i>0?R.ok():R.error();
    }

    @Override
    public R del(List<Long> ids) {
        int i = sysMenuMapper.del(ids);
        return i>0?R.ok():R.error();
    }
}
